﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Movimento.BusinessLogic
{
    public class ControleMovimentoBolsa : BaseBusinessLogic
    {
        #region Métodos Públicos

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.DataMovimento CalcularDataAberturaMovimento()
        {
            ResourceAccess.ControleMovimento controleMovimento = new ResourceAccess.ControleMovimento();
            BusinessEntity.Parameter.SistemaBovespa sistemaBolsa = new BusinessEntity.Parameter.SistemaBovespa();
            BusinessEntity.DataMovimento dataMovimento = new BusinessEntity.DataMovimento();
            sistemaBolsa.Sistema = Sinacor.Servico.Bovespa.Movimento.BusinessEntity.Enum.TipoSistema.Bolsa;

            BusinessEntity.Resultado resultado = controleMovimento.CalcularDataAberturaMovimento(sistemaBolsa);

            if (resultado.Sucesso)
                dataMovimento.Valor = resultado.DataMovimento;
            else
                this.TratarExcecoes(resultado);

            return dataMovimento;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.InformacoesMovimento ObterInformacoesMovimento(BusinessEntity.DataMovimento request)
        {
            return new ResourceAccess.ControleMovimentoBolsa().ObterInformacoesMovimento(request);
        }

        public void RemontarCalendario()
        {
            BusinessEntity.Parameter.FiltroRemontaCalendario filtro = new BusinessEntity.Parameter.FiltroRemontaCalendario { Sistema = BusinessEntity.Enum.TipoSistema.Bolsa };
            ResourceAccess.ControleMovimento raControleMovimento = new ResourceAccess.ControleMovimento();
            BusinessEntity.Resultado resultado = raControleMovimento.RemontarCalendario(filtro);

            if (!resultado.Sucesso)
               this.TratarExcecoes(resultado);
        }

        #endregion

        #region Métodos Privados

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        private void TratarExcecoes(BusinessEntity.Resultado request)
        {
            List<Object> _params;

            if (string.IsNullOrEmpty(request.Argumentos))
            {
                throw new BusinessException(request.CodigoErro);
            }
            else
            {
                _params = ErrorMessage.ConvertXmlArgumentsToParameters(request.Argumentos);

                if (_params != null)
                    throw new BusinessException(request.CodigoErro, _params.ToArray());
                else
                    throw new BusinessException(request.CodigoErro);
            }
        }

        #endregion
    }
}
